﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLCargo : Inventione.Framework.BusinessLogic.BLBase
    {
        
        // Representa o objeto de acesso a dados
        private DACargo da = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLCargo()
            : base("DEFAULT")
        {
            da = new DACargo("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLCargo(string tenantId)
            : base(tenantId)
        {
            da = new DACargo(tenantId);
        }

        /// <summary>
        /// Consulta os cargos de um contrato
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de cargos</returns>
        public List<CARGO> consultarCargosPorContrato(int cdContrato, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<CARGO> retorno = null;

            try
            {
                retorno = this.da.consultarCargosPorContrato(cdContrato, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta os cargos de um contrato (Count)
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarCargosPorContratoCount(int cdContrato)
        {
            int retorno = 0;

            try
            {
                retorno = da.consultarCargosPorContratoCount(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um cargo
        /// </summary>
        /// <param name="cdCargo">Código do cargo</param>
        /// <returns>Entidade cargo</returns>
        public CARGO obterCargo(int cdCargo)
        {
            CARGO retorno = null;

            try
            {
                retorno = da.obterCargo(cdCargo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um cargo
        /// </summary>
        /// <param name="cdCargo">Código do cargo</param>
        /// <returns>Lista contendo uma entidade cargo</returns>
        public List<CARGO> listarCargo(int cdCargo)
        {
            List<CARGO> retorno = null;

            try
            {
                retorno = this.da.listarCargo(cdCargo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista os cargos de um contrato
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <returns>Lista contendo uma entidade cargo</returns>
        public List<CARGO> listarCargosPorContrato(int cdContrato)
        {
            List<CARGO> retorno = null;

            try
            {
                retorno = this.da.listarCargosPorContrato(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista os cargos de um contrato.
        /// Utilização em combo
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <returns>Lista de cargos</returns>
        public List<TOCombo> listarCargosContratoCombo(int cdContrato)
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarCargosContratoCombo(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #region Métodos básicos - CRUD

        /// <summary>
        /// Insere um cargo
        /// </summary>
        /// <param name="entity">Entidade cargo</param>
        /// <returns>Entidade cargo</returns>
        public CARGO inserirCargo(CARGO entity)
        {
            CARGO retorno = null;

            try
            {
                retorno = this.da.inserirCargo(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de um cargo
        /// </summary>
        /// <param name="entity">Enteidade cargo</param>
        public void atualizarCargo(CARGO entity)
        {
            try
            {
                this.da.atualizarCargo(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui um cargo
        /// </summary>
        /// <param name="entity">Entidade cargo</param>
        public void excluirCargo(CARGO entity)
        {
            try
            {
                this.da.excluirCargo(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion
    }
}
